package handlers

import (
	"context"
	"fmt"
	"github.com/gin-gonic/gin"
	"math/rand"
	"month3/api/request"
	"month3/dao"
	"month3/inits"
	"month3/pkg"
	"net/http"
	"time"
)

func SendSms(c *gin.Context) {
	var data request.SendSmsReq
	err := c.ShouldBind(&data)
	if err != nil {
		c.JSON(http.StatusOK, gin.H{
			"Code": 500,
			"Msg":  "参数错误",
			"Data": nil,
		})
		return
	}

	code := rand.Intn(9000) + 1000
	err = inits.RDB.Set(context.Background(), GetKey(data.Mobile), code, time.Minute*30).Err()
	if err != nil {
		c.JSON(http.StatusOK, gin.H{
			"Code": 500,
			"Msg":  "验证码存储失败",
			"Data": nil,
		})
		return
	}

	//go pkg.Sms(data.Mobile, strconv.Itoa(code))

	c.JSON(http.StatusOK, gin.H{
		"Code": 200,
		"Msg":  "成功",
		"Data": true,
	})
}

func GetKey(mobile string) string {
	return fmt.Sprintf("code:%s", mobile)
}

func GetCartKey(mobile string) string {
	return fmt.Sprintf("cart:%s", mobile)
}

func Login(c *gin.Context) {
	var data request.LoginReq
	err := c.ShouldBind(&data)
	if err != nil {
		c.JSON(http.StatusOK, gin.H{
			"Code": 500,
			"Msg":  "参数错误",
			"Data": nil,
		})
		return
	}

	user := dao.Login(data.Mobile)
	if user.Id == 0 {
		user = dao.Register(data.Mobile)
		if user.Id == 0 {
			c.JSON(http.StatusOK, gin.H{
				"Code": 500,
				"Msg":  "注册失败",
				"Data": nil,
			})
			return
		}
	}
	if inits.RDB.Get(context.Background(), GetCartKey(data.Mobile)).Val() >= "5" {
		c.JSON(http.StatusOK, gin.H{
			"Code": 500,
			"Msg":  "验证码错误5次，重新申请验证码",
			"Data": nil,
		})
		return
	}
	if inits.RDB.Get(context.Background(), GetKey(data.Mobile)).Val() != data.Code {
		inits.RDB.Incr(context.Background(), GetCartKey(data.Mobile))                   //计数
		inits.RDB.Expire(context.Background(), GetCartKey(data.Mobile), time.Minute*30) //
		c.JSON(http.StatusOK, gin.H{
			"Code": 500,
			"Msg":  "验证码错误",
			"Data": nil,
		})
		return
	}
	token, err := pkg.NewJWT("zj").CreateToken(pkg.CustomClaims{
		ID: uint(user.Id),
	})
	if err != nil {
		c.JSON(http.StatusOK, gin.H{
			"Code": 500,
			"Msg":  "token生成失败",
			"Data": nil,
		})
		return
	}

	c.JSON(http.StatusOK, gin.H{
		"Code": 200,
		"Msg":  "成功",
		"Data": token,
	})
}

func Upload(c *gin.Context) {
	file, err := c.FormFile("file")
	if err != nil {
		c.JSON(http.StatusOK, gin.H{
			"Code": 200,
			"Msg":  "上传失败",
			"Data": nil,
		})
		return
	}

	dst := "D:\\gohome\\ks\\month3\\static\\" + file.Filename
	// 上传文件至指定的完整文件路径
	c.SaveUploadedFile(file, dst)
	img := "/static/" + file.Filename
	c.JSON(http.StatusOK, gin.H{
		"Code": 200,
		"Msg":  "上传成功",
		"Data": img,
	})
}

func AddRoom(c *gin.Context) {
	userId := c.GetUint("userId")
	c.JSON(http.StatusOK, gin.H{
		"Code": 200,
		"Msg":  "成功",
		"Data": dao.AddRoom(int(userId)),
	})
}

func AddRoomUser(c *gin.Context) {
	var data request.AddRoomUserReq
	err := c.ShouldBind(&data)
	if err != nil {
		c.JSON(http.StatusOK, gin.H{
			"Code": 500,
			"Msg":  "参数错误",
			"Data": nil,
		})
		return
	}
	result := dao.GetULevel(data.RoomId, data.ULevel)
	if result.ULevel != 1 && result.ULevel != 2 {
		c.JSON(http.StatusOK, gin.H{
			"Code": 500,
			"Msg":  "群主和管理员才有权限移除群成员",
			"Data": nil,
		})
		return
	}

	user := dao.AddRoomUser(data.RoomId, data.RoomUserId)

	c.JSON(http.StatusOK, gin.H{
		"Code": 200,
		"Msg":  "成功",
		"Data": user,
	})
}

func UpdateRoomUser(c *gin.Context) {
	var data request.UpdateRoomUserReq
	err := c.ShouldBind(&data)
	if err != nil {
		c.JSON(http.StatusOK, gin.H{
			"Code": 500,
			"Msg":  "参数错误",
			"Data": nil,
		})
		return
	}
	dao.UpdateRoomUser(data.RoomId, data.RoomUserId)
	c.JSON(http.StatusOK, gin.H{
		"Code": 200,
		"Msg":  "成功",
		"Data": true,
	})
}

func DelRoomUser(c *gin.Context) {
	var data request.DelRoomUserReq
	err := c.ShouldBind(&data)
	if err != nil {
		c.JSON(http.StatusOK, gin.H{
			"Code": 500,
			"Msg":  "参数错误",
			"Data": nil,
		})
		return
	}
	result := dao.GetULevel(data.RoomId, data.ULevel)
	if result.ULevel != 1 && result.ULevel != 2 {
		c.JSON(http.StatusOK, gin.H{
			"Code": 500,
			"Msg":  "群主和管理员才有权限移除群成员",
			"Data": nil,
		})
		return
	}

	dao.DelRoomUser(data.RoomId, data.RoomUserId)

	c.JSON(http.StatusOK, gin.H{
		"Code": 200,
		"Msg":  "成功",
		"Data": true,
	})
}

func DelRoom(c *gin.Context) {
	var data request.DelRoomReq
	err := c.ShouldBind(&data)
	if err != nil {
		c.JSON(http.StatusOK, gin.H{
			"Code": 500,
			"Msg":  "参数错误",
			"Data": nil,
		})
		return
	}

	userId := c.GetUint("userId")
	if userId != 1 {
		c.JSON(http.StatusOK, gin.H{
			"Code": 500,
			"Msg":  "群主才有权限解散群聊",
			"Data": nil,
		})
		return
	}

	dao.DelRoom(data.RoomUserId)

	c.JSON(http.StatusOK, gin.H{
		"Code": 200,
		"Msg":  "成功",
		"Data": true,
	})
}
